﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Data;

namespace prjMateriais
{
    public partial class frmProcessoEntradaMaterial : FormProcessoPadrao.FormProcessoPadrao
    {
        bool first;
        int codigoLote;
        int codigoMovimentacao;

        public frmProcessoEntradaMaterial()
        {
            InitializeComponent();
            dtpData.MinDate = System.DateTime.Today;
            codigoLote = -1;
        }

        public override bool metodo()
        {
            try
            {
                if (chkNovo.Checked)
                {
                    saveLote();
                }
                else
                {
                    updateLote();
                }
                saveMovimentacao();
                //Conexao.getInstance.CommitTransacao();
                updateLoteMov();
                return true;
            }
            catch (Exception ex)
            {
                MessageBox.Show("Houve um erro na execução do processo! \n Verifique! \n" + ex.Message, "Erro!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }

        }

        private void updateLote()
        {
            campos = new List<string>();

            campos.Add("CodigoTipoEstoque = " + cboTipoEstoque.SelectedValue);
            campos.Add("CodigoMaterial = " + cboMaterial.SelectedValue);
            campos.Add("Quantidade = (Quantidade +" + int.Parse(txtQtd.Text) + ")");

            this.update(ConstTabelas.LOTE, campos, ConstTabelas.LOTE_PK, cboLote.SelectedValue);
        }

        /// <summary>
        /// Relacionar a Movimentação com o Lote
        /// Não poderia ser feito no insert da movimentação, pq ainda não havia sido comitado o Lote, logo ele ainda não existe
        /// </summary>
        private void updateLoteMov()
        {
            campos.Clear();
            campos.Add("Lote = " + codigoLote);

            this.update(ConstTabelas.MOVIMENTACOES, campos, ConstTabelas.MOVIMENTACOES_PK, codigoMovimentacao);
        
        }
        
        private void saveMovimentacao()
        {
            campos.Clear();

            if (values == null) { values = new List<object>(); }

            values.Clear();

            
            campos.Add("Quantidade");
            campos.Add("HistoricoMovimentacao");
            campos.Add("TipoEstoque");
            campos.Add("Data");

            
            values.Add(txtQtd.Text);
            values.Add(cboHistorico.SelectedValue);
            values.Add(cboTipoEstoque.SelectedValue);
            values.Add(System.DateTime.Now.ToString(("MM/dd/yyyy")));

            this.insert(ConstTabelas.MOVIMENTACOES, campos, values);
        }

        private void setCodigoMov()
        {
            string sql = SqlCrud.getInstance.selectMax(ConstTabelas.MOVIMENTACOES);
            DataTable dt = Conexao.getInstance.executeQuery(sql);
            codigoMovimentacao = Convert.ToInt32(dt.Rows[0][0]) + 1;
        }

        private void setCodigoLote()
        {
            if (chkNovo.Checked)
            {
                if (codigoLote == -1)
                {
                    string sql = SqlCrud.getInstance.selectMax(ConstTabelas.LOTE);
                    DataTable dt = Conexao.getInstance.executeQuery(sql);
                    codigoLote = Convert.ToInt32(dt.Rows[0][0]) + 1;
                }
            }
            else
            {
                codigoLote = Convert.ToInt32(cboLote.SelectedValue);
            }
        }

        public void loadHistorico()
        {
            try
            {
                string sql = SqlCrud.getInstance.select(ConstTabelas.HISTORICOMOVIMENTACAO, "Nome like '%entrada%'");
                DataTable dt = Conexao.getInstance.executeQuery(sql);
                cboHistorico.DataSource = dt;
                cboHistorico.DisplayMember = "Nome";
                cboHistorico.ValueMember = ConstTabelas.HISTORICOMOVIMENTACAO_PK;
            }
            catch { }
        }

        private void saveLote()
        {
            campos = new List<string>();
            values = new List<Object>();

            if (dadosValidos())
            {
                campos.Add("Nome");
                campos.Add("CodigoTipoEstoque");
                campos.Add("CodigoMaterial");
                campos.Add("Quantidade");
                campos.Add("Data");

                values.Add(txtLote.Text);
                values.Add(cboTipoEstoque.SelectedValue);
                values.Add(cboMaterial.SelectedValue);
                values.Add(txtQtd.Text);
                values.Add(dtpData.Value.ToString(("MM/dd/yyyy")));

                this.insert(ConstTabelas.LOTE, campos, values);
            }

        }



        public override bool dadosValidos()
        {
            if (!this.first)
            {
                if (chkNovo.Checked)
                {
                    if (isNull(txtLote.Text))
                    {

                        MessageBox.Show("É necessário informar o Lote", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                        return false;
                    }
                }
                else
                {
                    if (cboLote.DataSource == null)
                    {
                        MessageBox.Show("É necessário informar o Lote", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                        return false;
                    }
                }
                if (isNull(cboTipoEstoque.SelectedValue))
                {
                    MessageBox.Show("É necessário informar o Tipo de Estoque", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return false;
                }
                if (isNull(cboMaterial.SelectedValue))
                {
                    MessageBox.Show("É necessário informar o Material", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return false;
                }
                if (isNull(txtQtd.Text))
                {
                    MessageBox.Show("É necessário informar a quantidade", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return false;
                }
                if (isNull(cboHistorico.SelectedValue))
                {
                    MessageBox.Show("É necessário informar o Historico de Movimentação", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return false;
                }
            }
            first = false;
            return true;
        }

        private bool isNull(Object value)
        {
            if (value.GetType() == typeof(string))
            {
                if (value.ToString() == "") { return true; }
            }
            else
            {
                if (value == null) { return true; } // em caso de combos
            }
            return false;
        }

        private void frmProcessoEntradaMaterial_Load(object sender, EventArgs e)
        {
            pnlFimProcesso.Visible = false;
            tbcntrlEtapas.Visible = false;
            pnlFimProcesso.Dock = DockStyle.Fill;
            pnlInicio.Dock = DockStyle.Fill;
            insereTextoProcesso(" de Entrada de Material");
        }

        private void frmProcessoEntradaMaterial_Shown(object sender, EventArgs e)
        {
            first = true;
            chkNovo.Checked = true;
            loadCombos(ConstTabelas.MATERIAL, ConstTabelas.MATERIAL_PK, cboMaterial);
            loadCombos(ConstTabelas.TIPOESTOQUE, ConstTabelas.TIPOESTOQUE_PK, cboTipoEstoque, false);
            loadHistorico();
            setCodigoLote();
            setCodigoMov();
        }

        private void cboLote_SelectedValueChanged(object sender, EventArgs e)
        {

            try
            {
                string sql = SqlCrud.getInstance.selectCampo(ConstTabelas.LOTE, "Codigo", "Data", cboLote.SelectedValue);
                DataTable dt = Conexao.getInstance.executeQuery(sql);
                dtpData.MinDate = Convert.ToDateTime(dt.Rows[0][0]);
                dtpData.Value = Convert.ToDateTime(dt.Rows[0][0]);
            }
            catch
            { }
        }

        private void cboLote_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        private void chkNovo_CheckedChanged(object sender, EventArgs e)
        {
            txtLote.Visible = chkNovo.Checked;
            cboLote.Visible = !chkNovo.Checked;
            dtpData.Enabled = chkNovo.Checked;
            dtpData.MinDate = System.DateTime.Today;
        }

        private void cboMaterial_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        private void cboLote_Click(object sender, EventArgs e)
        {
            loadCombos(ConstTabelas.LOTE, ConstTabelas.LOTE_PK, cboLote,false);
        }

    }
}
